package com.igeek.jdbc.dao;

import com.igeek.jdbc.entity.Girl;
import com.igeek.jdbc.utils.JDBCByC3P0Utils;
import com.igeek.jdbc.utils.JDBCUtils;

import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * XxxDao 访问数据库的类
 */
public class GirlDao {

    //插入女生信息
    public void insert(Girl girl){
        //1.获得连接对象
        Connection conn = JDBCUtils.getConn();

        String sql = "insert into girl values(null,?,?,?,?,null,?)";
        PreparedStatement ppst = null;
        ResultSet rs = null;

        try {
            //2.通过连接对象，获得语句对象
            //若想要获得自增主键，传入参数Statement.RETURN_GENERATED_KEYS
            ppst = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);

            //3.给?占位符赋值  第一个参数：是?的位置   第二个参数：传入的值
            ppst.setString(1,girl.getName());
            ppst.setString(2,girl.getSex());
            ppst.setTimestamp(3,girl.getBorndate());
            ppst.setString(4,girl.getPhone());
            ppst.setInt(5,girl.getBoyFriendId());

            //4.执行
            ppst.executeUpdate();
            System.out.println("插入成功");

            //5.获取刚刚插入的自增主键
            rs = ppst.getGeneratedKeys();
            while(rs.next()){
                System.out.println("当前插入的女生id = "+rs.getInt(1));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //5.关闭资源
            JDBCUtils.close(conn,ppst,null);
        }
    }


    //通过名称模糊查询女生信息
    public List<Girl> selectAll(String name){
        List<Girl> list = new ArrayList<Girl>();

        //1.获得连接对象
        //Connection conn = JDBCUtils.getConn();
        Connection conn = JDBCByC3P0Utils.getConn();

        //2.通过连接对象获得语句对象
        String sql = "select * from girl where name like concat('%',?,'%')";
        PreparedStatement ppst = null;
        ResultSet rs = null;

        try {
            ppst = conn.prepareStatement(sql);

            //3.给?占位符传值
            ppst.setString(1,name);

            //4.执行查询，返回结果集
            rs = ppst.executeQuery();

            //5.处理结果集  rs.getXxx(字段名 | 表中字段对应的位置)
            while(rs.next()){
                Girl girl = new Girl(rs.getInt(1),rs.getString(2),rs.getString(3),
                        rs.getTimestamp(4),rs.getString(5),
                        rs.getString(6),rs.getInt(7));
                list.add(girl);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //6.关闭资源
            //JDBCUtils.close(conn,ppst,rs);
            JDBCByC3P0Utils.close(conn,ppst,rs);
        }

        return list;
    }

    //通过id查询女生信息
    public Girl selectOne(Integer id){
        Girl girl = null;

        //1.获得连接对象
        Connection connection = JDBCUtils.getConn();

        //2.编写sql语句  ?占位符
        String sql = "select * from girl where id = ?";

        //3.通过连接对象，预编译sql语句，获得语句对象
        PreparedStatement ppst = null;
        ResultSet rs = null;
        try {
            ppst = connection.prepareStatement(sql);

            //4.给?占位符传值  setXxx(给第几个?传值 , 值)   其中Xxx代表的是将要设置的数据的类型
            ppst.setInt(1,id);

            //5.执行查询，返回结果集
            rs = ppst.executeQuery();

            //6.处理结果集  getXxx(字段的下标 | 字段的名称)  其中Xxx代表的是将要获取的数据的类型
            while(rs.next()){
                girl = new Girl(rs.getInt("id") , rs.getString("name") , rs.getString("sex"),
                        rs.getTimestamp("borndate") , rs.getString("phone") , rs.getString("photo") ,
                        rs.getInt("boyfriend_id"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //7.关闭资源
            JDBCUtils.close(connection , ppst , rs);
        }

        //8.返回对象
        return girl;
    }


    //删除某位女生
    public void delete(Integer id){
        //1.获得连接对象
        //Connection conn = JDBCUtils.getConn();
        Connection conn = JDBCByC3P0Utils.getConn();

        //2.编写SQL语句，通过连接对象预编译SQL，获得语句对象
        PreparedStatement ppst = null;
        try {
            ppst = conn.prepareStatement("delete from girl where id = ?");

            //3.给？占位符传值
            ppst.setInt(1,id);

            //4.执行删除操作
            ppst.executeUpdate();
            System.out.println("删除成功");
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //5.关闭资源
            //JDBCUtils.close(conn , ppst , null);
            JDBCByC3P0Utils.close(conn,ppst,null);
        }

    }


    //更新某位女生信息
    public void update(Girl girl){
        //1.获得连接对象
        Connection conn = JDBCUtils.getConn();

        //2.通过连接对象，获得语句对象
        String sql = "update girl set name = ?, borndate = ? , phone = ? , boyfriend_id = ? where id = ?";
        PreparedStatement ppst = null;

        try {
            //3.给?占位符传值
            ppst = conn.prepareStatement(sql);
            ppst.setString(1,girl.getName());
            ppst.setTimestamp(2,girl.getBorndate());
            ppst.setString(3,girl.getPhone());
            ppst.setInt(4,girl.getBoyFriendId());
            ppst.setInt(5,girl.getId());

            //4.执行
            ppst.executeUpdate();
            System.out.println("更新成功");
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //5.关闭资源
            JDBCUtils.close(conn , ppst , null);
        }
    }

}
